package com.chub.study.modules.controller;

import com.chub.RespEnum;
import com.chub.RespResult;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.chub.study.exception.StudyException;
import com.chub.study.modules.annotation.LogRecord;
import com.chub.study.modules.service.PsnInfoService;
import com.chub.study.modules.entity.PsnInfo;
import com.chub.study.modules.entity.PsnInfoDTO;
import com.chub.study.modules.entity.PsnInfoVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;


/**
 * 人员信息表 前端控制器
 *
 * @author Chub
 * @since 2024-08-28
 */
@Api(tags = "人员信息表")
@Validated
@RestController
@RequestMapping("psnInfo")
public class PsnInfoController extends BaseController {

    @Autowired
    private PsnInfoService psnInfoService;

    /**
     * 列表查询
     *
     * @param reqDto
     * @return
     */
    @LogRecord(methodDesc = "分页查询")
    @ApiOperation("分页查询")
    @PostMapping("/selectPsnInfoByPage")
    public RespResult<IPage<PsnInfo>> selectPsnInfoByPage(@RequestBody PsnInfoDTO reqDto) throws StudyException {
        logger.info("分页查询请求参数：reqDto = {}", reqDto);

        // controller里做一些入参校验, 方式一： 在方法中名中抛出异常,由异常统类统一返回：
        // Optional.ofNullable(reqDto).orElseThrow(() -> new StudyException(RespEnum.PARAM_ERROR, "请求参数不能为空"));
        // Optional.ofNullable(reqDto.getAge()).orElseThrow(() -> new StudyException(RespEnum.PARAM_ERROR, "年龄不能为空"));

        return psnInfoService.selectPsnInfoByPage(reqDto);
    }

    /**
     * 列表查询
     *
     * @param reqDto
     * @return
     */
    @LogRecord(methodDesc = "列表")
    @ApiOperation("列表")
    @PostMapping("/list")
    public RespResult<List<PsnInfoVO>> list(@RequestBody PsnInfoDTO reqDto) {
        logger.info("列表查询请求参数：reqDto = {}", reqDto);

        // controller里做一些入参校验, 方式二：
        if (Objects.isNull(reqDto)) {
            return RespResult.error(RespEnum.PARAM_ERROR.getCode(), "请求参数不能为空");
        }
        if (Objects.isNull(reqDto.getAge())) {
            return RespResult.error(RespEnum.PARAM_ERROR.getCode(), "年龄不能为空");
        }


        return RespResult.success(psnInfoService.list(reqDto));
    }

    /**
     * 保存
     *
     * @param reqDto
     * @return
     */
    @ApiOperation("保存")
    @PostMapping("/save")
    public RespResult<Void> save(@Validated @RequestBody PsnInfoDTO reqDto) {
        logger.info("保存请求参数：reqDto = {}", reqDto);
        psnInfoService.save(reqDto);
        return RespResult.success("保存成功");
    }


    /**
     * 修改
     *
     * @param reqDto
     * @return
     */
    @ApiOperation("修改")
    @PostMapping(value = "/update")
    public RespResult<Void> update(@Validated @RequestBody PsnInfoDTO reqDto) {
        logger.info("修改请求参数：reqDto = {}", reqDto);
        psnInfoService.update(reqDto);
        return RespResult.success("修改成功");
    }

    /**
     * 查询详情
     *
     * @param id
     * @return
     */
    @ApiOperation("查询详情")
    @PostMapping("/detail")
    public RespResult<PsnInfoVO> get(@ApiParam("记录ID") @RequestParam String id) {
        logger.info("查询详情请求参数：id = {}", id);
        return RespResult.success(psnInfoService.detail(id));
    }

    /**
     * 删除
     *
     * @param ids
     * @return
     */
    @ApiOperation("删除")
    @PostMapping("/delete")
    public RespResult<Void> delete(@RequestParam Set<String> ids) {
        logger.info("删除请求参数：ids = {}", ids);
        psnInfoService.delete(ids);
        return RespResult.success("删除成功");
    }

    /**
     * 单元测试 列表查询
     *
     * @param reqDto
     * @return
     */
    @LogRecord(methodDesc = "分页查询")
    @ApiOperation("分页查询")
    @PostMapping("/queryPsnInfoByPage")
    public RespResult<IPage<PsnInfo>> queryPsnInfoByPage(@RequestBody PsnInfoDTO reqDto) throws StudyException {
        logger.info("分页查询请求参数：reqDto = {}", reqDto);

        // controller里做一些入参校验, 方式一： 在方法中名中抛出异常,由异常统类统一返回：
        // Optional.ofNullable(reqDto).orElseThrow(() -> new StudyException(RespEnum.PARAM_ERROR, "请求参数不能为空"));
        // Optional.ofNullable(reqDto.getAge()).orElseThrow(() -> new StudyException(RespEnum.PARAM_ERROR, "年龄不能为空"));

        return psnInfoService.queryPsnInfoByPage(reqDto);
    }
}
